package com.iva.beam;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.context.RequestContext;
import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import com.iva.beam.profesor.LoginProfesoresBeam;
import com.iva.dto.CrearTareaDto;
import com.iva.model.TbActividad;
import com.iva.model.TbRotaciones;
import com.iva.model.TbRotacionesHasActividad;
import com.iva.model.VwAlumnosUsuario;
import com.iva.model.VwProfActividades;
import com.iva.service.findService;
import com.iva.service.mensajeService;
import com.iva.service.tareasService;

@Component("profesorCreateActivity")
public class ProfesorCrearActividadTareaBeam implements Serializable{

	@Autowired
	findService find;
	@Autowired
	tareasService tarea;
	@Autowired
	mensajeService mensaje;
	@Autowired 
	private ApplicationContext context;

	private CrearTareaDto crearTareaDto  = new CrearTareaDto();

	public CrearTareaDto getCrearTareaDto() {
		return crearTareaDto;
	}

	public void setCrearTareaDto(CrearTareaDto crearTareaDto) {
		this.crearTareaDto = crearTareaDto;
	}
	private double porcentajeTotal;
	private boolean requiereAuto;
	private boolean autorizar;

	public double getPorcentajeTotal() {
		return porcentajeTotal;
	}

	public void setPorcentajeTotal(double porcentajeTotal) {
		this.porcentajeTotal = porcentajeTotal;
	}

	public boolean isAutorizar() {
		return autorizar;
	}

	public void setAutorizar(boolean autorizar) {
		this.autorizar = autorizar;
	}

	public boolean isRequiereAuto() {
		return requiereAuto;
	}

	public void setRequiereAuto(boolean requiereAuto) {
		this.requiereAuto = requiereAuto;
	}
	private String destination = "C:\\Apps\\"; 
	private TbRotacionesHasActividad rot;
	private int idRotacionHasActividad;
	public int getIdRotacionHasActividad() {
		return idRotacionHasActividad;
	}
	public void setIdRotacionHasActividad(int idRotacionHasActividad) {
		this.idRotacionHasActividad = idRotacionHasActividad;
	}
	public TbRotacionesHasActividad getRot() {
		return rot;
	}
	public void setRot(TbRotacionesHasActividad rot) {
		this.rot = rot;
	}
	private List<TbActividad> listTbActividad;
	public List<TbActividad> getListTbActividad() {
		return listTbActividad;
	}
	public void setListTbActividad(List<TbActividad> listTbActividad) {
		this.listTbActividad = listTbActividad;
	}


	private UploadedFile  file;

	public UploadedFile getFile() {
		return file;
	}
	public void setFile(UploadedFile file) {
		this.file = file;
	}
	public Float getPorcentajeActividad() {
		return porcentajeActividad;
	}
	public void setPorcentajeActividad(Float porcentajeActividad) {
		this.porcentajeActividad = porcentajeActividad;
	}
	public Integer getPeriodoEvaluacion() {
		return periodoEvaluacion;
	}
	public void setPeriodoEvaluacion(Integer periodoEvaluacion) {
		this.periodoEvaluacion = periodoEvaluacion;
	}
	public Character getCargado() {
		return cargado;
	}
	public void setCargado(Character cargado) {
		this.cargado = cargado;
	}
	public Date getFechaAsigna() {
		return fechaAsigna;
	}
	public void setFechaAsigna(Date fechaAsigna) {
		this.fechaAsigna = fechaAsigna;
	}
	public Date getFechaEntrega() {
		return fechaEntrega;
	}
	public void setFechaEntrega(Date fechaEntrega) {
		this.fechaEntrega = fechaEntrega;
	}
	public String getDescripcion() {
		return descripcion;
	}
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	public String getAsunto() {
		return asunto;
	}
	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}


	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	private String observaciones;
	private Float porcentajeActividad;
	private Integer periodoEvaluacion;
	private Character cargado;
	private Date fechaAsigna;
	private Date fechaEntrega;
	private String descripcion;
	private String asunto;
	private String idRotacion;
	private String idActividad;
	public String getIdActividad() {
		return idActividad;
	}
	public void setIdActividad(String idActividad) {
		this.idActividad = idActividad;
	}
	public String getIdRotacion() {
		return idRotacion;
	}
	public void setIdRotacion(String idRotacion) {
		this.idRotacion = idRotacion;
	}


	private TbActividad tbActividad;
	private TbRotaciones tbRotaciones;
	private TbRotacionesHasActividad tbRotacionesHasActividad;
	private List<TbRotaciones> listRotaciones;
	public List<TbRotaciones> getListRotaciones() {
		return listRotaciones;
	}
	public void setListRotaciones(List<TbRotaciones> listRotaciones) {
		this.listRotaciones = listRotaciones;
	}
	public TbRotacionesHasActividad getTbRotacionesHasActividad() {
		return tbRotacionesHasActividad;
	}
	public void setTbRotacionesHasActividad(
			TbRotacionesHasActividad tbRotacionesHasActividad) {
		this.tbRotacionesHasActividad = tbRotacionesHasActividad;
	}
	public TbActividad getTbActividad() {
		return tbActividad;
	}
	public void setTbActividad(TbActividad tbActividad) {
		this.tbActividad = tbActividad;
	}
	public TbRotaciones getTbRotaciones() {
		return tbRotaciones;
	}
	public void setTbRotaciones(TbRotaciones tbRotaciones) {
		this.tbRotaciones = tbRotaciones;
	}


	public void createTarea(String idActividad){
		//Limpiar ventana
		this.crearTareaDto = new CrearTareaDto();				
		this.porcentajeTotal = 0;
		this.crearTareaDto.setIdActividad(idActividad);
		this.listTbActividad = find.listTbActividad(null);
		//return "dialog:createTarea?modal=true";
	}


	public void handleFileUpload(FileUploadEvent event) {  
		FacesMessage msg = new FacesMessage("Succesful", event.getFile().getFileName() + " is uploaded.");
		System.out.println("Success "+ event.getFile().getFileName() + " is uploaded.");
		FacesContext.getCurrentInstance().addMessage(null, msg);  
		try {
			System.out.println("Content Type " + event.getFile().getContentType().split("/").length);
			System.out.println("File Name " + event.getFile().getFileName());
			copyFile(event.getFile().getFileName(), event.getFile().getInputstream());
		} catch (IOException e) {
			e.printStackTrace();
		}
	}  



	public void copyFile(String fileName, InputStream in) {
		try {


			// write the inputStream to a FileOutputStream
			OutputStream out = new FileOutputStream(new File(destination + fileName));


			int read = 0;
			byte[] bytes = new byte[1024];

			while ((read = in.read(bytes)) != -1) {
				out.write(bytes, 0, read);
			}

			in.close();
			out.flush();
			out.close();

			System.out.println("New file created!");
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
	}

	private void calculaPorcentaje(String rotacion) {
		try{
			HttpSession session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );
			VwAlumnosUsuario usuario = (VwAlumnosUsuario)session.getAttribute("dto");
			this.porcentajeTotal = 0; 
			String sql = " where id.codigoEmp='"+usuario.getId().getNombreUsuario()+"' and id.tbActividadIdActividad=12 and id.idRotacion="+rotacion;
			List<VwProfActividades> listVwProfActividades = tarea.listVwProfActividades(sql);
			Iterator iterator = listVwProfActividades.iterator();
			while(iterator.hasNext()){
				VwProfActividades obj = (VwProfActividades) iterator.next();			
				this.porcentajeTotal += obj.getId().getPorcentajeActividad();
			}
			System.out.println(this.porcentajeTotal);
//			if(this.porcentajeActividad + this.porcentajeTotal >100){
//				throw new Exception("porcentaje");
//			}	
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
	}

	public String saveTarea(){
		this.rot = new TbRotacionesHasActividad();
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		String message = null;
		FacesMessage msg = null;				
		try{
			setTarea();
			calculaPorcentaje(this.getIdRotacion());		
			tarea.insertRotacionHasActividad(this.rot);
			tarea.senTarea(this.rot.getIdRotacionesHasActividad());
			message = "Exito";
			msg=		new FacesMessage(FacesMessage.SEVERITY_INFO, "La Tarea fue Envida Con " + message,  null);


		}catch(Exception ex){
			if(ex.getMessage().equals("porcentaje")){
				message = ", el porcentaje debe ser menor a " + (100 - this.porcentajeTotal);
			}
			else{
				message = ", Contactar al administrador";
			}
			msg =    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al efecutar el ingreso de la tarea" + message,  null);

			ex.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
		this.crearTareaDto = new CrearTareaDto();
		return tabMenuProfesores.dirige(0);
	}
	
	public void saveTareaDraftClose(){
		this.rot = new TbRotacionesHasActividad();
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		String message = null;
		FacesMessage msg = null;				
		try{
			setTarea();
			calculaPorcentaje(this.getIdRotacion());		
			tarea.insertRotacionHasActividad(this.rot);
			//tarea.senTarea(this.rot.getIdRotacionesHasActividad());
			message = "Exito";
			msg=		new FacesMessage(FacesMessage.SEVERITY_INFO, "La Tarea fue Envida Con " + message,  null);


		}catch(Exception ex){
			if(ex.getMessage().equals("porcentaje")){
				message = ", el porcentaje debe ser menor a " + (100 - this.porcentajeTotal);
			}
			else{
				message = ", Contactar al administrador";
			}
			msg =    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al efecutar el ingreso de la tarea" + message,  null);

			ex.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
		this.crearTareaDto = new CrearTareaDto();
		tabMenuProfesores.dirige(0);
	}
	
	public void closeCrearTarea(){
		this.crearTareaDto = new CrearTareaDto();
	}


	public void setTarea(){		
		InputStream input = null;
		ByteArrayOutputStream output = null;
		String type = null;
		byte[] buffer = null;		
		System.out.println("id rotacion " + this.idRotacion);
		try {	
			if(crearTareaDto.getFile()!=null){
				StringTokenizer token = new StringTokenizer(crearTareaDto.getFile().getFileName(),".");
				while(token.hasMoreTokens()){
					System.out.println("nombre " + token.nextToken());
					type = token.nextToken();
					System.out.println("Type " + type);

				}
				output = new ByteArrayOutputStream();	        	
				input = crearTareaDto.getFile().getInputstream();
				buffer = new byte[(int) file.getSize()];
				for (int length; (length = input.read(buffer)) > 0;) {
					output.write(buffer, 0, length);
					System.out.println("guarda el fichero ");
				}

			}else{
				System.out.println("fichero vacio ");
			}

			this.rot.setPorcentajeActividad(crearTareaDto.getPorcentajeActividad());
			this.rot.setAsunto(crearTareaDto.getAsunto());
			this.rot.setDescripcion(crearTareaDto.getDescripcion());
			this.rot.setFechaAsigna(new Date());
			this.rot.setFechaEntrega(crearTareaDto.getFechaEntrega());
			this.rot.setCargado('P');
			this.rot.setPeriodoEvaluacion(4);
			this.rot.setTbActividad(find.findTbActividad(Integer.parseInt(crearTareaDto.getIdActividad())));
			this.rot.setTbRotaciones(find.findTbRotaciones(Integer.parseInt(crearTareaDto.getIdRotacion())));
			this.rot.setUploadFile(this.crearTareaDto.getAsunto()+"."+type);
			if(output != null)
				this.rot.setAttachement(output.toByteArray());						
			//copyFile(this.getAsunto()+"."+type, file.getInputstream());
		} catch (Exception e) {
			System.out.println("Entra en el catch");								
			e.printStackTrace();
		}finally{
			if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
			if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
			RequestContext.getCurrentInstance().update("full");
//			this.fechaEntrega= null;
//			this.descripcion= null;
//			this.asunto= null;
//			this.porcentajeActividad = null;						
		}
	}

	public void viewTarea(VwProfActividades dto){
		this.listTbActividad = find.listTbActividad(null);
		this.rot  = find.findTbRotacionesHasActividad(dto.getId().getIdRotacionesHasActividad());
		this.crearTareaDto = new CrearTareaDto();
		this.crearTareaDto.setIdRotacion(rot.getTbRotaciones().getIdtbRotaciones().toString());
		this.crearTareaDto.setIdActividad(rot.getTbActividad().getIdActividad().toString());
		this.idRotacionHasActividad = rot.getIdRotacionesHasActividad();
		this.crearTareaDto.setFechaEntrega(rot.getFechaEntrega());
		this.crearTareaDto.setDescripcion(rot.getDescripcion());
		this.crearTareaDto.setAsunto(rot.getAsunto());				
		this.crearTareaDto.setPorcentajeActividad(rot.getPorcentajeActividad());
		//return "dialog:editTarea?widgetVar=editTareaWV&modadl=true";
	}

	public void editTareaAction(){
		this.rot = find.findTbRotacionesHasActividad(this.idRotacionHasActividad);		
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		String message = null;
		FacesMessage msg = null;				
		try{
			setTarea();
			calculaPorcentaje(this.getIdRotacion());		
			tarea.updateRotacionHasActividad(this.rot);
			tarea.senTarea(this.rot.getIdRotacionesHasActividad());
			message = "Exito";
			msg=		new FacesMessage(FacesMessage.SEVERITY_INFO, "La Tarea fue Envida Con " + message,  null);


		}catch(Exception ex){
			if(ex.getMessage().equals("porcentaje")){
				message = ", el porcentaje debe ser menor a " + (100 - this.porcentajeTotal);
			}
			else{
				message = ", Contactar al administrador";
			}
			msg =    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al efecutar el ingreso de la tarea" + message,  null);

			ex.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
		this.crearTareaDto = new CrearTareaDto();
		tabMenuProfesores.dirige(0);
		//RequestContext.getCurrentInstance().execute("editTareaWV.hide()");
	}

	
	public void editTareaNoEnviar(){
		this.rot = find.findTbRotacionesHasActividad(this.idRotacionHasActividad);		
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		String message = null;
		FacesMessage msg = null;				
		try{
			setTarea();
			calculaPorcentaje(this.getIdRotacion());		
			tarea.updateRotacionHasActividad(this.rot);
			//tarea.senTarea(this.rot.getIdRotacionesHasActividad());
			message = "Exito";
			msg=		new FacesMessage(FacesMessage.SEVERITY_INFO, "La Tarea fue Envida Con " + message,  null);


		}catch(Exception ex){
			if(ex.getMessage().equals("porcentaje")){
				message = ", el porcentaje debe ser menor a " + (100 - this.porcentajeTotal);
			}
			else{
				message = ", Contactar al administrador";
			}
			msg =    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al efecutar el ingreso de la tarea" + message,  null);

			ex.printStackTrace();
		}
		FacesContext.getCurrentInstance().addMessage(null, msg);
		this.crearTareaDto = new CrearTareaDto();
		tabMenuProfesores.dirige(0);
		//RequestContext.getCurrentInstance().execute("editTareaWV.hide()");
	}


	public String saveActividad(){
		TbRotacionesHasActividad dto = new TbRotacionesHasActividad();
		InputStream input = null;
		ByteArrayOutputStream output = null;
		String type = null;
		byte[] buffer = null;
		String message = null;
		FacesMessage msg = null;
		LoginProfesoresBeam tabMenuProfesores = (LoginProfesoresBeam)context.getBean("loginProfesoresBeam");
		try {	
			if(file!=null){
				StringTokenizer token = new StringTokenizer(file.getFileName(),".");
				while(token.hasMoreTokens()){
					System.out.println("nombre " + token.nextToken());
					type = token.nextToken();
					System.out.println("Type " + type);

				}
				output = new ByteArrayOutputStream();	        	
				input = file.getInputstream();
				buffer = new byte[(int) file.getSize()];
				for (int length; (length = input.read(buffer)) > 0;) {
					output.write(buffer, 0, length);
					System.out.println("entra al metodo ");
				}

			}else{
				System.out.println("vacio ");
			}
			dto.setPorcentajeActividad(this.porcentajeActividad);
			dto.setAsunto(this.getAsunto());
			dto.setDescripcion(this.descripcion);
			dto.setFechaAsigna(new Date());
			dto.setFechaEntrega(this.fechaEntrega);
			dto.setCargado('P');
			dto.setPeriodoEvaluacion(4);
			dto.setTbActividad(find.findTbActividad(Integer.parseInt(this.idActividad)));
			dto.setTbRotaciones(find.findTbRotaciones(Integer.parseInt(this.idRotacion)));
			dto.setUploadFile(this.getAsunto()+"."+type);
			dto.setActividadReqAutoriza(this.requiereAuto);
			if(output != null)
				dto.setAttachement(output.toByteArray());
			tarea.insertRotacionHasActividad(dto);
			tarea.senTarea(dto.getIdRotacionesHasActividad());
			message = "Exito";
			msg=		new FacesMessage(FacesMessage.SEVERITY_INFO, "Enviada con " + message,  null);
			//copyFile(this.getAsunto()+"."+type, file.getInputstream());
		} catch (Exception e) {
			System.out.println("Entra en el catch");
			message = ", Contactar al administrador";
			msg =    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al efecutar el envío " + message,  null);
			e.printStackTrace();
		}finally{
			if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
			if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
			RequestContext.getCurrentInstance().update("full");
			this.fechaEntrega= null;
			this.descripcion= null;
			this.asunto= null;
			this.porcentajeActividad = null;
			this.requiereAuto = false;
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}
		return tabMenuProfesores.dirige(1);
	}


	public void creatActividad(String idActividad){
		//Limpiar ventana
		this.fechaEntrega= null;
		this.descripcion= null;
		this.asunto= null;
		this.porcentajeActividad = null;
		this.requiereAuto = false;

		String sql = " where codigoActividad='AC'";
		this.listTbActividad = find.listTbActividad(sql);
		for(TbActividad tbActividad : this.listTbActividad){
			this.idActividad = tbActividad.getIdActividad().toString();
		}
		//		return "dialog:createActividad?modal=true";
	}


	public String viewActividad(VwProfActividades dto){
		this.listTbActividad = find.listTbActividad(null);		
		this.rot  = find.findTbRotacionesHasActividad(dto.getId().getIdRotacionesHasActividad());
		this.idRotacionHasActividad = rot.getIdRotacionesHasActividad();
		this.fechaEntrega= rot.getFechaEntrega();
		this.descripcion= rot.getDescripcion();
		this.asunto= rot.getAsunto();
		this.idActividad = rot.getTbActividad().getIdActividad().toString();
		this.idRotacion = rot.getTbRotaciones().getIdtbRotaciones().toString();
		this.porcentajeActividad = rot.getPorcentajeActividad();
		this.requiereAuto = rot.isActividadReqAutoriza();
		return "dialog:editActividad?modal=true";
	}

	public void editActividadAction(){
		this.rot = find.findTbRotacionesHasActividad(this.idRotacionHasActividad);
		InputStream input = null;
		ByteArrayOutputStream output = null;
		String type = null;
		byte[] buffer = null;
		String message = null;
		FacesMessage msg = null;

		try {	
			if(file!=null){
				StringTokenizer token = new StringTokenizer(file.getFileName(),".");
				while(token.hasMoreTokens()){
					System.out.println("nombre " + token.nextToken());
					type = token.nextToken();
					System.out.println("Type " + type);

				}
				output = new ByteArrayOutputStream();	        	
				input = file.getInputstream();
				buffer = new byte[(int) file.getSize()];
				for (int length; (length = input.read(buffer)) > 0;) {
					output.write(buffer, 0, length);
					System.out.println("entra al metodo ");
				}

			}else{
				System.out.println("vacio ");
			}
			this.rot.setPorcentajeActividad(this.porcentajeActividad);
			this.rot.setAsunto(this.getAsunto());
			this.rot.setDescripcion(this.descripcion);
			this.rot.setFechaAsigna(new Date());
			this.rot.setFechaEntrega(this.fechaEntrega);
			this.rot.setCargado('P');
			this.rot.setPeriodoEvaluacion(4);
			this.rot.setTbActividad(find.findTbActividad(Integer.parseInt(this.idActividad)));
			this.rot.setTbRotaciones(find.findTbRotaciones(Integer.parseInt(this.idRotacion)));
			this.rot.setUploadFile(this.getAsunto()+"."+type);
			this.rot.setActividadReqAutoriza(this.requiereAuto);
			if(output != null)
				this.rot.setAttachement(output.toByteArray());
			tarea.updateRotacionHasActividad(this.rot);
			//tarea.senTarea(dto.getIdRotacionesHasActividad());
			message = "Exito";
			msg=		new FacesMessage(FacesMessage.SEVERITY_INFO, "Actualizada con " + message,  null);
			//copyFile(this.getAsunto()+"."+type, file.getInputstream());
		} catch (Exception e) {
			System.out.println("Entra en el catch" );
			message = ", Contactar al administrador";

			msg =    new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error al efecutar la actualización" + message,  null);
			e.printStackTrace();
		}finally{
			if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
			if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
			RequestContext.getCurrentInstance().update("full");
			this.fechaEntrega= null;
			this.descripcion= null;
			this.asunto= null;
			this.porcentajeActividad = null;
			FacesContext.getCurrentInstance().addMessage(null, msg);
		}

	}
}
